/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package ClassFrame;

import java.io.IOException;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.game.Sprite;

/**
 *
 * @author trung duy
 */
public class JFont {

    private static byte FONT = 0;
    public static final byte FONT_1 = FONT++;
    public static final byte FONT_2 = FONT++;
    public static final byte FONT_3 = FONT++;
    // ảnh font
    private Image image;
    // kiểu font
    private int type;
    // chiều cao ký tự
    private int h;
    // bề rộng ký tự
    private int w;
    // khoảng cách giữa các ký tự
    private int space;
    // xác định dùng JFont hay font hệ thống 
    private boolean isDefault;
    // xâu chứa tất cả các ký tự trong font iamge
    public static final StringBuffer sb = new StringBuffer().append(" !").append('\"').append("#$%&").append('\'').append("()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[").append('\\').append("]^_`abcdefghijklmnopqrstuvwxyz{|}~");
    // mảng xác định độ rộng của ký tự font chữ 1
    public static final byte font_1_Width[] = {
        6,// SPACE
        2,//! EXCLAMATION_MARK
        5,//“ QUOTATION_MARK
        6,//# NUMBER_SING
        5,//$ 
        8,//%
        7,//&
        2,//‘
        3,//(
        3,//)
        3,//*
        6,//+
        2,//,
        3,//-
        2,//.
        3,///
        5,//0
        5,//1
        5,//2
        5,//3
        6,//4
        5,//5
        5,//6
        5,//7
        5,//8
        5,//9
        2,//:
        2,//;
        5,//<
        5,//=
        5,//>
        5,//?
        10,//@
        7,//A
        6,//B
        7,//C
        6,//D
        5,//E
        5,//F
        7,//G
        6,//H
        2,//I
        5,//J
        6,//K
        6,//L
        9,//M
        6,//N
        7,//O
        6,//P
        7,//Q
        7,//R
        6,//S
        6,//T
        6,//U
        7,//V
        11,//W
        6,//X
        6,//Y
        6,//Z
        3,//[
        3,//\
        3,//]
        5,//^
        6,//_
        3,//`
        5,//a
        6,//b
        5,//c
        6,//d
        6,//e
        5,//f
        6,//g
        6,//h
        2,//i
        3,//j
        6,//k
        2,//l
        10,//m
        6,//n
        6,//o
        6,//p
        6,//q
        4,//r
        6,//s
        5,//t
        6,//u
        5,//v
        9,//w
        5,//x
        7,//y
        5,//z
        4,//{
        1,//|
        4,//}
        5,//~
        7//ki tu khong hien thi duoc
    };
    // mảng xác định độ rộng ký tự font chữ 2
    public static final byte[] font_2_Width = {
        3,// SPACE
        3,//! EXCLAMATION_MARK
        7,//“ QUOTATION_MARK
        10,//# NUMBER_SING
        9,//$ 
        16,//%
        14,//&
        4,//‘
        5,//(
        5,//)
        8,//*
        12,//+
        4,//,
        6,//-
        3,//.
        9,///
        11,//0
        6,//1
        9,//2
        10,//3
        11,//4
        10,//5
        11,//6
        9,//7
        10,//8
        10,//9
        4,//:
        4,//;
        11,//<
        12,//=
        11,//>
        8,//?
        15,//@
        13,//A
        10,//B
        12,//C
        13,//D
        10,//E
        9,//F
        13,//G
        12,//H
        3,//I
        7,//J
        11,//K
        9,//L
        15,//M
        12,//N
        15,//O
        10,//P
        14,//Q
        10,//R
        10,//S
        11,//T
        12,//U
        12,//V
        21,//W
        14,//X
        15,//Y
        14,//Z
        5,//[
        7,//\
        5,//]
        9,//^
        14,//_
        15,//`
        11,//a
        12,//b
        11,//c
        11,//d
        12,//e
        7,//f
        11,//g
        10,//h
        3,//i
        5,//j
        11,//k
        3,//l
        17,//m
        10,//n
        11,//o
        10,//p
        11,//q
        7,//r
        10,//s
        6,//t
        10,//u
        11,//v
        17,//w
        11,//x
        11,//y
        10,//z
        7,//{
        2,//|
        7,//}
        12,//~
        17// ki tu khong hien thi duoc
    };

    // hàm khởi tạo
    public JFont(int type) {
        this.type = type;
        isDefault = true;

        if (FONT_1 == type) {
            try {
                image = Image.createImage("/font1.png");
                h = 14;
                w = 11;
            } catch (IOException ex) {
                isDefault = false;
                System.out.println("Can't load image font font1.png");
            }
        } else if (FONT_2 == type) {
            try {
                image = Image.createImage("/font2.png");
                h = 20;
                w = 21;
            } catch (IOException ex) {
                isDefault = false;
                System.out.println("Can't load image font font2.png");
            }
        } else if (FONT_3 == type) {
        }
    }

    // thiết lập khoảng cách giữa các chữ
    public int getSpace() {
        return space;
    }

    public void setSpace(int space) {
        this.space = space;
    }

    // lấy thứ tự của ký tự trong font image
    public int getIndex(char ch) {
        int index = sb.toString().indexOf(String.valueOf(ch));
        if (index < 0 || index >= sb.length()) {
            index = 95;
        }
        return index;
    }

    // lấy độ rộng thực của ký tự
    public int getWidth(char ch) {
        int width = 0;
        if (FONT_1 == type) {
            width = font_1_Width[getIndex(ch)];
        } else if (FONT_2 == type) {
            width = font_2_Width[getIndex(ch)];
        }

        return width;
    }

    // lấy độ dài xâu con
    public int subStringWidth(String str, int start, int end) {
        int width = 0;

        for (int i = start; i <= end; ++i) {
            width += getWidth(str.charAt(i)) + space;
        }

        return width;
    }

    // lấy độ dài xâu
    public int stringWidth(String str) {
        return subStringWidth(str, 0, str.length() - 1);
    }

    // vẽ 1 ký tự
    public void drawChar(Graphics g, char ch, int x, int y, int anchor, int angle) {
        g.drawRegion(image, w * getIndex(ch), 0, getWidth(ch), h, angle, x, y, anchor);
    }

    // vẽ xâu
    public void drawString(Graphics g, String str, int x, int y, int anchor, int angle) {
        if (!isDefault) {
//            g.setFont(CanvasGame.blFont);
            g.setColor(175,131,11);
            g.drawString(str, x, y, Graphics.TOP | Graphics.LEFT);
        } else {
            switch (angle) {
                case Sprite.TRANS_NONE:
                    for (int i = 0, n = str.length(); i < n; ++i) {
                        drawChar(g, str.charAt(i), x + subStringWidth(str, 0, i - 1) + space, y, anchor, angle);
                    }
                    break;
                case Sprite.TRANS_ROT270:
                    for (int i = 0, n = str.length(); i < n; ++i) {
                        drawChar(g, str.charAt(i), x, y - subStringWidth(str, 0, i - 1) - space, anchor, angle);
                    }
                    break;
                case Sprite.TRANS_ROT180:
                    break;
                case Sprite.TRANS_ROT90:
                    for (int i = 0, n = str.length(); i < n; ++i) {
                        drawChar(g, str.charAt(i), x, y + subStringWidth(str, 0, i - 1) + space, anchor, angle);
                    }
                    break;
            }
        }
    }
    public int gethText(){
        return h;
    }
}
